home *** CD-ROM | disk | FTP | other *** search
/ BBS in a Box 7 / BBS in a Box - Macintosh - Volume VII (BBS in a Box) (January 1993).iso / Files / Prog / D-G / GameMaster.cpt / GameMaster / GameMaster next >
Text File  |  1987-06-06  |  22KB  |  888 lines

  1. '    **********************************
  2. '    GameMaster v1.0
  3. '    Role Playing Character Record System
  4. '    by L. Frank Turovich
  5. '
  6. '  Copyright 1987 by Ankh Enterprises
  7. '    Completed June 87
  8. '
  9. '  *Requires MS-BASIC Toolbox Routines
  10. '
  11. '  Any comments, critisisms, or suggestions
  12. '  would be appreciated at:
  13. '         GEnie address: BALTHASARD
  14. '
  15. '  A generic character record keeping system
  16. '  for role playing games.
  17. '
  18. '
  19. '---------------------------------------
  20. WINDOW CLOSE 1
  21. CLEAR 22000
  22. LIBRARY "ToolLib"
  23. GOSUB Initialization 
  24.  
  25. ON MENU GOSUB MenuEvent : MENU ON
  26. ON DIALOG GOSUB DialogEvent : DIALOG ON
  27.  
  28. MainLoop:
  29.  INITCURSOR
  30.  GOTO MainLoop 
  31.  
  32. '    ---------------------------------------
  33. '    SECTION A : Menu events subsection
  34. '    ---------------------------------------
  35. MenuEvent:
  36.  ChangeCursor! 4
  37.  menuID=MENU(0) : itemID=MENU(1)
  38.  ON menuID GOSUB FileMenu, ,CreateMenu,RecMenu
  39. EndMenuEvt:
  40.  MENU menuID,0,1
  41.  INITCURSOR
  42.  RETURN
  43.  
  44. FileMenu:
  45.  ON itemID GOSUB OpenRecord,CloseFile,SaveChar, ,MoveChar,DelChar,PrintOne, ,QuitBas,QuitDesk
  46.  RETURN
  47.  
  48. OpenRecord:
  49.  ON ERROR GOTO FileError
  50.  GOSUB GetCharRecord
  51.  ON ERROR GOTO 0
  52.  IF FileTitle$="" THEN RETURN
  53.  IF numRecords=0 THEN GOSUB OpenErr : GOSUB FiniFile : RETURN
  54.  GOSUB DrawRecMenu
  55.    MENU 1,2,1,"Close : "+FileTitle$+" "
  56.  MENU 3,1,0 : MENU 1,1,0
  57.  RETURN
  58.  
  59. CloseFile:
  60.  GOSUB CompareFile
  61.  IF changed=false THEN FiniClose
  62.  GOSUB SaveErr
  63.  IF btnID=2 THEN RETURN
  64.  IF btnID=3 THEN GOSUB SaveChar
  65.  
  66. FiniClose:
  67.  WINDOW CLOSE 1
  68.  scrnFlag=false : FileTitle$=""
  69.  GOSUB ReDoRec
  70.    MENU 1,2,0,"Close "
  71.    MENU 1,3,0 : MENU 1,5,0
  72.    MENU 1,6,0 : MENU 1,7,0
  73.  MENU 3,1,1 : MENU 1,1,1
  74.  CLOSE#2
  75.  RETURN
  76.  
  77. MoveChar:
  78. '    Open a second record file to move currently displayed
  79. '    character file to
  80.  DIM CharMove$(numEF)
  81.  SecTitle$=FILES$(1,"char")
  82.  ChangeCursor! 4
  83.  IF SecTitle$="" THEN ERASE CharMove$ : RETURN
  84.  ON ERROR GOTO FileError
  85.  OPEN "R",#3,SecTitle$,1135
  86.  idiot=0 : fred=0 : WordDt$="" : D9$=""
  87.  FOR j=1 TO numEF
  88.   IF j<lora-1 THEN fred=fldLen(j) ELSE fred=fldLen(24)
  89.   FIELD#3, idiot AS D9$,fred AS CharMove$(j)
  90.   idiot=idiot+fred
  91.  NEXT j
  92.  numRecords=LOF(3)/1135
  93.  '    look for first empty record in open file, save character
  94.  '    to that file 
  95.  GOSUB GetEmptyFile
  96.  IF found=false THEN GOSUB FullCharFile
  97.  GOSUB MoveTheChar
  98.  FOR j=numEF TO 1 STEP-1
  99.   LSET CharMove$(j)=CharData$(j)
  100.  NEXT j
  101.  PUT#3 ,empty
  102. EndMove:
  103.  CLOSE #3
  104.  ERASE CharMove$
  105.  WINDOW CLOSE 4
  106.  RETURN
  107.  
  108. DelChar:
  109.    IF PEEK(379)=4 THEN GOTO DelChar2
  110.  GOSUB DeleteWarning
  111.  IF btnID=2 THEN RETURN
  112. DelChar2:
  113.  GOSUB BlankFile    '    Wipe out the character file in buffer
  114.  PUT #2,file(0)     '    Write to disk
  115.  GOSUB DrawRecMenu    '  redraw record menu
  116.  GOSUB DoRecAgain
  117.  RETURN
  118.  
  119. BlankFile:
  120.  LSET CharData$(1)="<< name >>"
  121.  FOR j=2 TO numEF
  122.    LSET CharData$(j)=" "
  123.  NEXT
  124.  RETURN
  125.  
  126. PrintOne:
  127.  GOSUB DoReport
  128.  GOSUB EndPrint
  129.  charFlag=false
  130.  RETURN
  131.  
  132. QuitBas:
  133.  GOSUB CloseFile
  134.  MENU RESET
  135.  WINDOW CLOSE WINDOW(1)
  136.  LIST
  137.  END
  138.  
  139. QuitDesk:
  140.  GOSUB CloseFile
  141.  MENU RESET
  142.  SYSTEM
  143.  
  144. CreateMenu:
  145.  ON itemID GOSUB CreateFile,ReportStyle, ,ProgInfo,Help
  146.  RETURN
  147.  
  148. CreateFile:
  149.  FileTitle$=FILES$(0,"Call this character file:")
  150.  ChangeCursor! 4
  151.  IF FileTitle$="" THEN RETURN
  152.  CALL StrpName (FileTitle$)
  153.  ON BREAK GOSUB RecordQuit : BREAK ON
  154.    GOSUB CreateFMsg
  155.  
  156.  FOR numfile=1 TO 16
  157.   MOVETO 30,80 : DrawText!  "Creating record #";numfile;
  158.   GOSUB NewCharFile
  159.   GOSUB BlankFile
  160.   ON ERROR GOTO FileError
  161.   PUT #2,numfile
  162.   CLOSE#2
  163.  NEXT numfile
  164.  
  165.  NAME FileTitle$ AS FileTitle$,"char"
  166.  WINDOW CLOSE 4
  167.  scrnFlag=false : file(0)=1
  168.  GOSUB NewCharFile
  169.  GOSUB DrawRecMenu
  170.    MENU 1,2,1,"Close "+FileTitle$+" "
  171.  MENU 3,1,0 : MENU 1,1,0
  172.  GOSUB DoRecAgain
  173.  RETURN
  174.  
  175. RecordQuit:
  176.  BREAK OFF
  177.  CLOSE #2
  178.  KILL FileTitle$ : BEEP
  179.  WINDOW CLOSE 4
  180.  ON ERROR GOTO 0
  181.  RETURN EndMenuEvt
  182.  
  183. FileError:
  184.  IF ERR=52 THEN RESUME RecordQuit
  185.  IF ERR=55 THEN GOSUB MoveErr : RESUME MoveChar
  186.  IF ERR<>53 THEN ON ERROR GOTO 0
  187.  RESUME NEXT
  188.  
  189. ProgInfo:
  190.  CALL TitleScreen
  191.  RETURN
  192.  
  193. Help:
  194.  CALL Instruct
  195.  RETURN
  196.  
  197. RecMenu:
  198.  IF FileTitle$="" THEN RETURN
  199.  IF scrnFlag=true THEN GOSUB SaveChar
  200.  ChangeCursor! 4
  201.  file(0)=MENU(1)
  202. DoRecAgain:
  203.  GET #2,file(0)
  204.   MENU 4,file(0),2
  205.  MENU menuID,0,1
  206.  IF scrnFlag=false THEN GOSUB CharDisplay ELSE GOSUB NewScrn
  207.  RETURN
  208.  
  209. DrawRecMenu:
  210.    MENU 4,0,1,FileTitle$
  211.    FOR h=1 TO numRecords
  212.        GET#2,h
  213.        a$=FN Drop$(CharData$(1))
  214.        b$=CharData$(2)
  215.        c$=FN Drop$(CharData$(3))
  216.        d$=a$+" : Lvl "+b$+c$
  217.        MENU 4,h,1,d$
  218.    NEXT h
  219.    RETURN
  220.  
  221. ' ---------------------------------
  222. ' SECTION B : Character Editing
  223. ' ---------------------------------
  224. CharDisplay:
  225.  scrnFlag=true : top=30 : left=10
  226.  WINDOW 1,"",(left,top)-(500,330),2
  227.    MENU 1,3,1 : MENU 1,5,1
  228.    MENU 1,6,1 : MENU 1,7,1
  229.  PICTURE ON
  230.   SHOWPEN
  231.   TEXTFONT(4) : TEXTSIZE(9) : TEXTMODE(1)
  232.   MOVETO 10,10 : DrawText! "Edit character data"
  233.  
  234.   FOR h=1 TO lora
  235.    rSide=lSide(h)-LEN(Title$(h))*8
  236.    MOVETO rSide,y(h)-1 : DrawText! Title$(h)
  237.   NEXT h
  238.  
  239.   MOVETO 0,13 : LINETO 550,13
  240.   MOVETO 0,115 : LINETO 550,115
  241.   MOVETO 0,117 : LINETO 550,117
  242.   MOVETO 180,117 : LINETO 180,345
  243.   MOVETO 182,117: LINETO 182,345
  244.   PSET(181,117),30
  245.  PICTURE OFF
  246.  GenPic$=PICTURE$
  247.  
  248. NewScrn:
  249.  FOR h=1 TO lora-2
  250.   IF h<9 THEN type=1 ELSE type=2
  251.   IF h=2 THEN type=2
  252.   rSide=lSide(h)+(fldLen(h)*6)+4
  253.   EDIT FIELD h,CharData$(h),(lSide(h),y(h)-10)-(rSide,y(h)), ,type
  254.  NEXT h
  255.  
  256.  y=130
  257.  FOR h=lora-1 TO lora+10
  258.   EDIT FIELD h,CharData$(h),(5,y+4)-(170,y+14)
  259.   EDIT FIELD h+12,CharData$(h+12),(192,y+4)-(335,y+14)
  260.   EDIT FIELD h+24,CharData$(h+24),(345,y+4)-(485,y+14)
  261.   y=y+14
  262.  NEXT h
  263.  
  264.  numFields=numEF : eField=1
  265.  EDIT FIELD eField
  266.  INITCURSOR
  267.  RETURN
  268.  
  269. CompareFile:
  270.  IF scrnFlag=false THEN RETURN
  271.  changed=false
  272.  FOR j=1 TO numEF
  273.   IF EDIT$(j)<>CharData$(j) THEN changed=true
  274.   IF changed=true THEN RETURN
  275.  NEXT j
  276.  RETURN
  277.  
  278. CheckRet:
  279.  IF d<>6 THEN RETURN
  280.  CALL ChangeCursor! 4
  281.  GOSUB SaveChar
  282.  GOSUB DoRecAgain
  283.  RETURN
  284.  
  285. ' ---------------------------------------
  286. ' SECTION C : Dialog Events
  287. ' ---------------------------------------
  288. DialogEvent:
  289.  d=DIALOG(0)
  290.  ON d GOSUB DoBttns,DoEdit, , ,DoRefresh,DoReturn,DoTab
  291.  RETURN
  292.  
  293. DoBttns:
  294.  btnID=DIALOG(1)
  295.  RETURN
  296.  
  297. DoEdit:
  298.  eField=DIALOG(2)
  299.  EDIT FIELD eField
  300.  RETURN
  301.  
  302. DoRefresh:
  303.  IF WINDOW(0)<>1 THEN RETURN
  304.  PICTURE ,GenPic$
  305.  RETURN
  306.  
  307. DoReturn:
  308.  done=true
  309.  RETURN
  310.  
  311. DoTab:
  312.  GOSUB CheckLen
  313.  IF tooLong=1 THEN tooLong=0 : GOSUB DoRefresh : GOTO FiniTab
  314.  IF PEEK(379)=1 THEN GOTO ShiftTab
  315.  IF PEEK(379)=4 THEN GOTO OptTab
  316.  eField=(eField MOD numFields)+1
  317.  GOTO FiniTab
  318.  
  319. ShiftTab:
  320.  IF eField=>1 THEN eField=eField-1
  321.  IF eField=0 THEN eField=numFields
  322.  GOTO FiniTab
  323.  
  324. OptTab:
  325.  IF eField<=8 THEN eField=9 : GOTO FiniTab
  326.  IF eField<lora-2 AND eField>8 THEN eField=lora-1 : GOTO FiniTab
  327.  IF eField>lora-2 AND eField<lora+11 THEN eField=lora+11  : GOTO FiniTab
  328.  IF eField=>lora+11 THEN eField=1
  329.  
  330. FiniTab:
  331.  EDIT FIELD eField
  332.  RETURN
  333.  
  334. CheckLen:
  335.  IF eField=>35 THEN l=LEN(EDIT$(eField)) : IF l>fldLen(24) THEN GOSUB LenError : RETURN
  336.  IF eField=>23 THEN l=LEN(EDIT$(eField)) : IF l>fldLen(23)  THEN GOSUB LenError : RETURN
  337.  IF eField<23 THEN l=LEN(EDIT$(eField)) : IF l>fldLen(eField) THEN GOSUB LenError
  338.  RETURN
  339.  
  340. '  --------------------------------------
  341. '    SECTION D : I/O File Routines
  342. '    --------------------------------------
  343. SaveChar:
  344.  IF FileTitle$="" THEN RETURN
  345.  ChangeCursor! 4
  346.  FOR j=numEF TO 1 STEP-1
  347.   LSET CharData$(j)=EDIT$(j)
  348.  NEXT j
  349.  PUT#2,file(0)
  350.  GOSUB DrawRecMenu
  351.  RETURN
  352.  
  353. GetEmptyFile:
  354.  FOR empty=1 TO numRecords
  355.   GET #3,empty
  356.   IF LEFT$(CharMove$(1),2)="<<" THEN found=true ELSE found=false
  357.   IF found=true THEN RETURN
  358.  NEXT empty
  359.  RETURN
  360.  
  361. GetCharRecord:
  362.  FileTitle$=FILES$(1,"char")
  363.  ChangeCursor! 4 : IF FileTitle$="" THEN RETURN
  364. NewCharFile:
  365.  OPEN "R",#2,FileTitle$,1135
  366.  null=0 : fred=0 : WordDt$="" : D9$=""
  367.  
  368.  FOR j=1 TO numEF
  369.   IF j<lora-1 THEN fred=fldLen(j) ELSE fred=fldLen(24)
  370.   FIELD#2, null AS D9$,fred AS CharData$(j)
  371.   null=null+fred
  372.  NEXT j
  373.  
  374.  numRecords=LOF(2)/1135
  375.  CALL StrpName (FileTitle$)
  376.  RETURN
  377.  
  378. '  ---------------------------------------
  379. '     SECTION E : Printer Events
  380. '  ---------------------------------------
  381.  
  382. ReportStyle:
  383.  GOSUB CheckOpenFile
  384.  GenPic$="" : report=2
  385.  IF scrnFlag=true THEN GOSUB SaveChar  : WINDOW CLOSE 1
  386.  IF scrnFlag=true THEN scrnFlag=false
  387.  WINDOW 3,"",(40,35)-(470,320),-2
  388.  
  389.  TEXTFONT(0) : y=30
  390.  MOVETO 20,15 : PRINT"GameMaster Report Sheets"
  391.  MOVETO 0,20 : LINETO 500,20
  392.  bmsg$(3)="GM's Info"
  393.  bmsg$(4)="Character Info"
  394.  BUTTON 3,1,bmsg$(3),(140,y)-(250,y+15),3
  395.  BUTTON 4,2,bmsg$(4),(140,y+18)-(270,y+33),3
  396.  
  397.  y=95
  398.  FOR j=1 TO numRecords
  399.   IF j<9 THEN x=20 ELSE x=225
  400.   IF j=9 THEN y=95
  401.   GET #2,j
  402.   BUTTON j+4,1,CharData$(1),(x,y)-(x+180,y+15),2
  403.   IF LEFT$(CharData$(1),2)="<<" THEN BUTTON j+4,0
  404.   y=y+18
  405.  NEXT j
  406.  
  407.  LINE (10,81)-(420,245), ,b
  408.  LINE (8,79)-(422,247), ,b
  409.  MOVETO 20,85 : PRINT"  Character selection...  "
  410.  CALL ShowBttns ("Print","",1,0)
  411.  INITCURSOR
  412.  DIALOG OFF
  413.  
  414.  done=false
  415.  WHILE NOT done
  416.   WHILE DIALOG(0)<>1 : WEND
  417.   btnID=DIALOG(1)
  418.   IF btnID<3 THEN done=true
  419.   IF (btnID=3) OR (btnID=4) THEN GOSUB SetBtn : report=btnID-2
  420.   IF btnID>4 THEN GOSUB CharTabSet
  421.  WEND
  422.  DIALOG ON
  423.  WINDOW CLOSE 3
  424.  IF btnID=1 THEN GOSUB DoReport
  425. CancReport:
  426.  RETURN
  427.  
  428. CheckOpenFile:
  429.  IF FileTitle$="" THEN GOSUB OpenRecord
  430.  IF FileTitle$="" THEN RETURN MainLoop
  431.  RETURN
  432.  
  433. CharTabSet:
  434.  IF file(btnID-4)=0 THEN BUTTON btnID,2 ELSE BUTTON btnID,1
  435.  IF file(btnID-4)=0 THEN file(btnID-4)=true ELSE file(btnID-4)=0
  436.  RETURN
  437.  
  438. SetBtn:
  439.  FOR j=3 TO 4
  440.   BUTTON j,1
  441.  NEXT j
  442.  BUTTON btnID,2
  443.  RETURN
  444.  
  445. DoReport:
  446.  Esc$=CHR$(27)
  447.  FF$=CHR$(12)
  448.   IF PEEK(379)=4 THEN GOTO PrtChar2
  449.  GOSUB PrintWarning
  450.  IF btnID=2 THEN RETURN
  451. PrtChar2:
  452.  ChangeCursor! 4
  453.  ON BREAK GOSUB PrintQuit : BREAK ON
  454.  GOSUB ReportWarning
  455.  Dt$=DATE$
  456.  LPRINT Esc$;"c";
  457.  LPRINT Esc$;"L008";
  458.  LPRINT Esc$;"E";
  459.  IF charFlag=true THEN GOTO PrintCharSheet
  460.  
  461. ReportLoop:
  462.  k=0 : numFiles=0: '______  set up tab for later print view
  463.  FOR x=1 TO numRecords
  464.   IF file(x)=0 THEN GOTO NextRec
  465.   GET #2,x
  466.   ON report GOSUB PrintDMSheet,PrintCharSheet
  467. NextRec:
  468.  NEXT x
  469.  GOTO EndPrint
  470.  
  471. PrintQuit:
  472.  BREAK OFF
  473.  LPRINT CHR$(24)
  474. EndPrint:
  475.  IF report=1 AND numFiles<8 THEN LPRINT FF$;
  476.  
  477.  FOR x=1 TO numRecords
  478.   file(x)=0
  479.  NEXT
  480.  
  481.  WINDOW CLOSE 4
  482.  GOSUB CancReport
  483.  IF charFlag=true THEN RETURN ELSE RETURN EndMenuEvt
  484.  
  485. PrintDMSheet:
  486.  numFiles=numFiles+1
  487.  LPRINT CHR$(14);
  488.  IF numFiles=1 THEN LPRINT TAB(12) "GameMasters Info Sheet for "+Dt$
  489.  LPRINT CHR$(15);
  490.  LPRINT TAB(k);STRING$(80,"=")
  491.  LPRINT " "
  492.  LPRINT FN Drop$(CharData$(1));TAB(22) "HP: "+CharData$(17);TAB(40) "STR: "+CharData$(9);TAB(52) "INT: "+CharData$(12);TAB(65) CharData$(24)
  493.  LPRINT CharData$(2)+FN Drop$(CharData$(3));TAB(22) "AC: "+CharData$(16);TAB(40) "DEX: "+CharData$(10);TAB(52) "WIS: "+CharData$(13);TAB(65) CharData$(25)
  494.  LPRINT FN Drop$(CharData$(4));TAB(22) FN Drop$(CharData$(7));TAB(40) "CON: "+CharData$(11);TAB(52) "CHR: "+CharData$(14);TAB(65) CharData$(26)
  495.  LPRINT "("+FN Drop$(CharData$(58))+")";TAB(22) FN Drop$(CharData$(8));TAB(52) "COM: "+CharData$(15);TAB(65) CharData$(27)
  496.  LPRINT " "
  497.  IF numFiles=8 THEN LPRINT FF$ : numFiles=0
  498.  RETURN
  499.  
  500. PrintCharSheet:
  501.  LPRINT CHR$(14);
  502.  LPRINT "Player's Info Sheet for "+Dt$
  503.  LPRINT CHR$(15);
  504.  LPRINT " "
  505.  LPRINT TAB(k);FN Drop$(CharData$(1));TAB(k+60);"HP: "+CharData$(17)
  506.  LPRINT TAB(k);CharData$(2)+FN Drop$(CharData$(3));TAB(k+30);"Exp Pts: "+FN Drop$(CharData$(18));TAB(k+60);"AC: "+CharData$(16)
  507.  LPRINT TAB(k);FN Drop$(CharData$(4))TAB(k+30);"Gold: "+CharData$(20);
  508.  LPRINT TAB(k);FN Drop$(CharData$(5));TAB(k+30);"Silver: "+CharData$(21);TAB(k+60);FN Drop$(CharData$(7))
  509.  LPRINT TAB(k);CharData$(6);TAB(k+30);"Plat: "+FN Drop$(CharData$(22));TAB(k+60);FN Drop$(CharData$(8))
  510.  LPRINT TAB(k);"("+FN Drop$(CharData$(58))+")";TAB(k+30);"Gems: "+FN Drop$(CharData$(19))
  511.  LPRINT TAB(k);STRING$(80,"=")
  512.  LPRINT TAB(k);"STR: "+CharData$(9);"  "+first$;TAB(k+60);"Saving Throws:"
  513.  LPRINT TAB(k);"DEX: "+CharData$(10);"  "+sec$;TAB(k+60);"-------------"
  514.  LPRINT TAB(k);"CON: "+CharData$(11);"  "+other$;TAB(k+60);"Poison:"
  515.  LPRINT TAB(k);"INT: "+CharData$(12);"  "+fourth$;TAB(k+60);"Petri:"
  516.  LPRINT TAB(k);"WIS: "+CharData$(13);"  "+fifth$;TAB(k+60);"Rods:"
  517.  LPRINT TAB(k);"CHR: "+CharData$(14);"  "+sixth$;TAB(k+60);"Breath:"
  518.  LPRINT TAB(k);"COM: "+CharData$(15);TAB(k+60);"Spells:";s(5)
  519.  LPRINT TAB(k);STRING$(80,"-")
  520. NextLine:
  521.  LPRINT TAB(k);"Special Abilities:"
  522.  LPRINT TAB(k);"Languages:"
  523.  LPRINT TAB(k);STRING$(80,"-")
  524.  LPRINT TAB(k);"Misc Items:";TAB(k+30);"Magic Items:";TAB(k+60);"Attack Table:"
  525.  LPRINT TAB(k);"-----------";TAB(k+30);"-----------";TAB(k+60);"-------------"
  526.  i$=CHR$(124)
  527.  FOR j=35 TO 57
  528.   IF j<47 THEN LPRINT TAB(k);CharData$(j);TAB(k+30);CharData$(j-12);TAB(k+60);j-38;TAB(k+65);i$+"  "+i$+"  "+i$+"  "+i$+"  "i$
  529.   IF j>46 THEN LPRINT TAB(k);CharData$(j)
  530.  NEXT j
  531.  LPRINT FF$
  532.  RETURN
  533.  
  534. '    ---------------------------------------
  535. '    SECTION F : Subroutines
  536. '    ---------------------------------------
  537.  
  538. SUB StrpName (FileTitle$) STATIC
  539. SHARED Path$,FileTitle$
  540. position=LEN(FileTitle$)
  541. WHILE INSTR(position,FileTitle$,":")=0
  542.     position=position-1
  543. WEND
  544. Path$=LEFT$(FileTitle$,position)
  545. FileTitle$=MID$(FileTitle$,position+1)
  546. END SUB
  547.  
  548. SUB WindSize STATIC
  549.  SHARED r,b
  550.  r=WINDOW(2) : b=WINDOW(3)
  551.  END SUB
  552.  
  553. SUB ShowBttns (OK$,Extra$,cancl,other) STATIC
  554. SHARED r,b
  555.  CALL WindSize
  556.  BUTTON 1,1,OK$,(r-90,b-28)-(r-10,b-10),1
  557.  IF cancl=0 THEN GOTO FiniSub
  558.  BUTTON 2,1,"Cancel",(r-180,b-28)-(r-100,b-10),1
  559.  IF other=0 THEN GOTO FiniSub
  560.  BUTTON 3,1,"Save",(r-270,b-28)-(r-190,b-10),1
  561. FiniSub:
  562.  END SUB
  563.  
  564. SUB PaintBttn (r,b) STATIC
  565.  rf%(0)=b-32 : rf%(1)=r-94
  566.  rf%(2)=b-6 : rf%(3)=r-6
  567.   PENSIZE 3,3
  568.   FRAMEROUNDRECT VARPTR(rf%(0)),15,15
  569.  END SUB
  570.  
  571. SUB Message (msg$(),state,cancl,other) STATIC
  572. SHARED btnID,r,b
  573.  WINDOW 4,,(90,70)-(420,170),2
  574.  TEXTFONT(0) : M$=msg$(1)+msg$(2)
  575.  IF state=1 THEN BEEP
  576.  SetRect! mb%(0),20,20,300,65
  577.  TextBox! M$,mb%(0),0
  578.  IF state=0 THEN EXIT SUB
  579.  CALL WindSize
  580.  CALL PaintBttn (r,b)
  581.  ShowBttns  "Yes","",cancl,other
  582.  INITCURSOR
  583.  DIALOG OFF
  584.  d=0 
  585.  WHILE d<>1 AND d<>6
  586.   d=DIALOG(0)
  587.  WEND
  588.  btnID=DIALOG(1)
  589.  IF d=6 THEN btnID=1
  590.  DIALOG ON
  591.  WINDOW CLOSE 4
  592.  END SUB
  593.  
  594. SUB Instruct STATIC
  595.  WINDOW 3,,(10,30)-(500,330),-2
  596.  TEXTFONT(4) : TEXTSIZE(9)
  597.  DIM Info$(5)
  598.  Info$(1)="Index" : Info$(2)="File" : Info$(3)="Create"
  599.  Info$(4)="Cancel"
  600.  btnID=1 : GOSUB PageOne
  601.  y=290 : x=60
  602.  FOR j=1 TO 4
  603.   BUTTON j,1,Info$(j),(x,y-18)-(x+90,y)
  604.   x=x+95
  605.  NEXT j
  606.  INITCURSOR
  607.  BUTTON 1,0
  608. WLoop:
  609.  WHILE DIALOG(0)<>1 : WEND
  610.  
  611.  btnID=DIALOG(1)
  612.  ON btnID GOSUB PageOne,PageTwo,PageThree,CloseSub
  613.  
  614.  FOR x=1 TO 4
  615.   BUTTON x,1
  616.  NEXT x
  617.  BUTTON btnID,0
  618.  GOTO WLoop
  619.  
  620. PageOne:
  621.  n=8 : GOSUB HeaderDis
  622.  PRINT TAB(n+3)"GameMaster is a complete character management system designed "
  623.  PRINT TAB(n)"to facilitate the record keeping chores of the game referee"
  624.  PRINT TAB(n)"in a role playing environment."
  625.  PRINT TAB(n+3)"With GameMaster the game referee can keep track of all player"
  626.  PRINT TAB(n) "characters, NPC's, and other miscellaneous persona needed"
  627.  PRINT TAB(n)"for good role playing adventures."
  628.  PRINT TAB(n+3)"GameMaster was written by a game master for his own campaign "
  629.  PRINT TAB(n) "use and has reduced many of the tedious routines once done with "
  630.  PRINT TAB(n)"index cards."
  631.  PRINT TAB(n+3)"On the character edit screen GameMaster uses several keyboard "
  632.  PRINT TAB(n)"shortcuts to make data entry easy..."
  633.   PRINT
  634.  PRINT TAB(n+3)"<Tab> moves you to the next edit field."
  635.  PRINT TAB(n+3)"<Shift><Tab> moves you back up one edit field."
  636.  PRINT TAB(n+3)"<Option><Tab> moves you to the next block of edit fields."
  637.  PRINT TAB(n+3)"<Command><Return> saves character  information to disk."
  638.  PRINT TAB(n+3)"Using the <Option> key when selecting a menu item will bypass"
  639.  PRINT TAB(n+6)"many of the warning windows."
  640.  PRINT
  641.  PRINT TAB(n+3)"Simply click on one of the menu buttons displayed below to get"
  642.  PRINT TAB(n) "further details about GameMaster."
  643.  RETURN
  644.  
  645. PageTwo:
  646.  n=22 : GOSUB HeaderDis
  647.  PRINT"    Open ";TAB(n)"Opens a character file as the Record menu for"
  648.  PRINT TAB(n);"easy record selection."
  649.  PRINT
  650.  PRINT"    Close";TAB(n)"Closes the open character file."
  651.  PRINT
  652.  PRINT"    Save";TAB(n)"Saves character record open to character file open."
  653.  PRINT
  654.  PRINT"    Move";TAB(n)"Duplicates a character record from the open character"
  655.  PRINT TAB(n)"file to another character file."
  656.  PRINT
  657.  PRINT"    Delete";TAB(n)"Delete will remove the currently displayed character "
  658.  PRINT TAB(n)"record from the file.  It will first give an alert box "
  659.  PRINT TAB(n)"to give you the option not to remove the character."
  660.  PRINT
  661.  PRINT"    Print";TAB(n)"Selecting Print immediately prints out the displayed"
  662.  PRINT TAB(n)"characters information sheet."
  663.  RETURN
  664.  
  665. PageThree:
  666.  n=26 : GOSUB HeaderDis
  667.  PRINT"    New File...";TAB(n)"Creates a new character file containing room "
  668.  PRINT TAB(n)"for 16 different characters.  The file automatically"
  669.  PRINT TAB(n)"comes up as Record menu, then opens the first record"
  670.  PRINT TAB(n)"so that you can begin entering information "
  671.  PRINT TAB(n) "immediatelly."
  672.  PRINT
  673.  PRINT"    Report...";TAB(n)"Allows the GM to choose between printing:"
  674.  PRINT
  675.  PRINT TAB(n+5)"(1) GM info sheets (short character reports)"
  676.  PRINT TAB(n+5)"(2) full character information sheets"
  677.  PRINT
  678.  PRINT"    About GameMaster";TAB(n)"Gets program information."
  679.  PRINT
  680.  PRINT"    Help";TAB(n)"Calls up this short help file.";
  681.  RETURN
  682.  
  683. HeaderDis:
  684.  CLS : TEXTFONT(0) : TEXTSIZE (12)
  685.  MOVETO 400,15 : PRINT "Page";btnID;"of 3"
  686.  IF btnID=1 THEN Head$="What GameMaster can do for you..."
  687.  IF btnID=2 THEN Head$="File options..."
  688.  IF btnID=3 THEN Head$="Create Options..."
  689.  MOVETO 15,15 : PRINT Head$
  690.  TEXTFONT(4) : TEXTSIZE (9)
  691.  PRINT " "
  692.  RETURN
  693.  
  694. CloseSub:
  695.  WINDOW CLOSE 3
  696.  ERASE Info$
  697.  END SUB
  698.  
  699. SUB TitleScreen STATIC
  700.   WINDOW 4,"",(70,60)-(440,220),-2
  701.   msg$(1)="GameMaster v1.0"
  702.   msg$(2)="Role Playing Character Record System"
  703.   msg$(3)="-----------------------------------"
  704.   msg$(4)="by L. Frank Turovich"
  705.    msg$(5)="Copyright 1987 by Ankh Enterprises"
  706.   msg$(6)="GEnie mail : BALTHASARD"
  707.   TEXTFONT(0) :TEXTSIZE(24)
  708.   y=40 : txt=FN centerTxt(msg$(1))
  709.   MOVETO txt,y : DrawText! msg$(1)
  710.   TEXTSIZE(12) : y=46
  711.   FOR j=2 TO 6
  712.     txt=FN centerTxt(msg$(j)) : y=y+18
  713.    MOVETO txt,y : DrawText!  msg$(j)
  714.   NEXT
  715.  INITCURSOR
  716.  WHILE MOUSE(0)=0 : WEND
  717.  WINDOW CLOSE 4
  718.  END SUB
  719.  
  720. '    ---------------------------------------
  721. '    SECTION G : Alert Messsages
  722. '    ---------------------------------------
  723. OpenErr:
  724.  msg$(1)="GameMaster cannot open "+FileTitle$
  725.  msg$(2)=" while it is in an HFS folder."
  726.  Message msg$(),1,0,0
  727.  RETURN
  728.  
  729. SaveErr:
  730.  msg$(1)="Do you want to close "+FileTitle$
  731.  msg$(2)=" without saving "+FN Drop$(EDIT$(1))+"?"
  732.  Message msg$(),1,1,1
  733.  RETURN
  734.  
  735. MoveTheChar:
  736.  msg$(1)="Now moving "+FN Drop$(CharData$(1))+" to "
  737.  Temp$=FileTitle$ : StrpName (SecTitle$)
  738.  SecTitle$=FileTitle$ : FileTitle$=Temp$ : Temp$=""
  739.  msg$(2)=SecTitle$+" file."
  740.  Message msg$(),0,0,0
  741.  RETURN
  742.  
  743. FullCharFile:
  744.  msg$(1)="This file is full.   Do you still want to "
  745.  msg$(2)="move "+FN Drop$(CharData$(1))+"?"
  746.  Message msg$(),1,1,0
  747.  IF btnID=1 THEN GOSUB EndMove : GOTO MoveChar
  748.  RETURN EndMove
  749.  
  750. MoveErr:
  751.  msg$(1)="You cannot move "+FN Drop$(CharData$(1))+" to "
  752.  msg$(2)="the same file.   Try again with another."
  753.  Message msg$(),1,0,0
  754.  GOSUB EndMove
  755.  RETURN
  756.  
  757. DeleteWarning:
  758.  msg$(1)="Are you sure you want to delete "
  759.  msg$(2)=FN Drop$(CharData$(1))+"from "+FileTitle$+"?"
  760.  Message msg$(),1,1,0
  761.  RETURN
  762.  
  763. PrintWarning:
  764.  charFlag=true
  765.  msg$(1)="Make sure the printer is turned on "
  766.  msg$(2)="before continuing."
  767.  Message msg$(),1,1,0
  768.  RETURN
  769.  
  770. CreateFMsg:
  771.  msg$(1)="Now creating "+FileTitle$+" character file "
  772.  msg$(2)="Press "+CHR$(17)+" .  to halt."
  773.  Message msg$(),0,0,0
  774.   RETURN
  775.  
  776. LenError:
  777.  EDIT FIELD eField
  778.  msg$(1)="Entry too large for record field! "
  779.  msg$(2)="Delete some letters and try again."
  780.  Message msg$(),1,0,0
  781.  tooLong=1
  782.  RETURN
  783.  
  784. ReportWarning:
  785.  msg$(1)="Please wait while report is printed. "
  786.  msg$(2)="Press "+CHR$(17)+" . to stop printing."
  787.  Message msg$(),0,0,0
  788.  RETURN
  789.  
  790. '    ---------------------------------------
  791. '    SECTION H : Initialization
  792. '    ---------------------------------------
  793.  
  794. Initialization:
  795.  DEFINT a-z
  796.  ChangeCursor! 4
  797.  
  798.  true=-1 : false=0
  799.  cancl=0
  800.  fileFlag=2
  801.  charFlag=false
  802.  numEF=58
  803.  lora=24
  804.  
  805.  OK$="OK" : Extra$="Save"
  806.  
  807.  'DEF FN StrpName$(Dum$)=RIGHT$(Dum$,LEN(Dum$)-INSTR(Dum$,":"))    
  808.  DEF FN Drop$(Dum$)=LEFT$(Dum$,INSTR(Dum$,"  "))
  809.  DEF FN centerTxt(msg$)=(WINDOW(2)/2)-(WIDTH(msg$)/2)
  810.  
  811.  DIM Title$(lora),fldLen(lora),lSide(lora),y(lora)
  812.  FOR x=1 TO lora
  813.   READ Title$(x),fldLen(x),lSide(x),y(x)
  814.  NEXT x
  815.  
  816.  DIM file(16),file$(1)
  817.    file(0)=1
  818.    DIM msg$(2)
  819.  DIM CharData$(numEF),CharChange$(numEF)
  820.  
  821.  MENU 4,0,1,""
  822.  MENU 5,0,1,""
  823.  
  824.  MENU 1,0,1,"File"
  825.  MENU 1,1,1,"Open..."
  826.  MENU 1,2,0,"Close"
  827.  MENU 1,3,0,"Save"
  828.  MENU 1,4,0,"-"
  829.  MENU 1,5,0,"Move..."
  830.  MENU 1,6,0,"Delete"
  831.  MENU 1,7,0,"Print"
  832.  MENU 1,8,0,"-"
  833.  MENU 1,9,1,"Goto BASIC  "
  834.  MENU 1,10,1,"Quit"
  835.    CmdKey! 1,1,"O"
  836.    CmdKey! 1,3,"S"
  837.    CmdKey! 1,5,"M"
  838.    CmdKey! 1,6,"D"
  839.    CmdKey! 1,7,"P"
  840.    CmdKey! 1,10,"Q"
  841.  MENU 3,0,1,"Create"
  842.  MENU 3,1,1,"File..."
  843.  MENU 3,2,1,"Report"
  844.  MENU 3,3,0,"-"
  845.  MENU 3,4,1,"About GameMaster... "
  846.  MENU 3,5,1,"Help"
  847.    CmdKey! 3,1,"F"
  848.    CmdKey! 3,2,"R"
  849.    CmdKey! 3,5,"H"
  850.  
  851. ReDoRec:
  852.  MENU 4,0,1,"Record"
  853.  MENU 4,1,1,"No Record Open "
  854.  RETURN
  855.  
  856. '    ---------------------------------------
  857. '    SECTION I : Data
  858. '    ---------------------------------------
  859. EFieldData:
  860. ' ____section 1 - char info
  861.  DATA "Name",35,45,30
  862.  DATA "Level",4,45,44
  863.  DATA "Class",20,130,44
  864.  DATA "Align",22,45,58
  865.  DATA "Race",15,45,72
  866.  DATA "Sex",7,185,72
  867.  DATA "Armor",22,45,94
  868.  DATA "Wpn",25,45,108
  869. ' ____section 2 - stats
  870.  DATA "Str",5,295,30
  871.  DATA "Dex",5,295,44
  872.  DATA "Con",5,295,58
  873.  DATA "Int",5,375,30
  874.  DATA "Wis",5,375,44
  875.  DATA "Chr",5,375,58
  876.  DATA "Com",5,450,30
  877.  DATA "AC",3,450,44
  878.  DATA "HP",3,450,58
  879.  DATA "Exp Pts",20,350,76
  880.  DATA "Gems",30,290,94
  881.  DATA "Gold",6,265,108
  882.  DATA "Silv",6,350,108
  883.  DATA "Plat",6,435,108
  884. ' ____section 3 - magic items section
  885.  DATA Magic items,27,100,130
  886. ' ____section 4 - misc items section
  887.  DATA Misc items,23,278,130
  888.